I heard about Home Assistant home automation project before: open source, integrates with everything... But it wasn't until I replaced my HVAC system recently that I decided to see what it can do. And it is great!

Some informational sites:

Installation

Home Assistant documentation describes a number of ways to install it.

Dedicated Hardware - not the one

One approach is to use dedicated Raspberry Pi-based hardware, and the purpose-built units offered for sale look great; this is probably the best way for those who do not have a home server; I do though, and prefer to run Home Assistant on it - along with other things.

Docker Containers - not the one

One way to run Home Assistant on a machine not dedicated to it is to use Docker containers; this installation method is called Home Assistant Container. Setting up Home Assistant this way is simple enough - here is the docker-compose.yaml:

version: '3'
services:
  homeassistant:
    restart: unless-stopped
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    privileged: true
    network_mode: host
    volumes:
      - /home/homeassistant/config:/config
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro

One issue with this approach is that there is no one-click updates: new image needs to be pulled explicitly with a Docker command; another is - no access to add-ons: each add-on needs to be installed manually using a separate docker-compose.yaml

Here, for example, is one for Z-Wave:

version: '3.7'
services:
  zwave-js-ui:
    container_name: zwave-js-ui
    image: zwavejs/zwave-js-ui:latest
    restart: unless-stopped
    tty: true
    stop_signal: SIGINT
    environment:
      - SESSION_SECRET=...
      - ZWAVEJS_EXTERNAL_CONFIG=/usr/src/app/store/.config-db
    networks:
      - zwave
    devices:
      # Do not use /dev/ttyUSBX serial devices,
      # as those mappings can change over time.
      # Instead, use the /dev/serial/by-id/X serial device for your Z-Wave stick.
      - '/dev/serial/by-id/...:/dev/zwave'
    volumes:
      - '/home/homeassistant/zwave-js-ui/config:/usr/src/app/store:Z'
    ports:
      - '8091:8091' # port for web interface
      - '3000:3000' # port for Z-Wave JS websocket server
networks:
  zwave:

(Instead of the UI-less minimalist image https://hub.docker.com/r/kpine/zwave-js-server, I went with the official image that also has a very nice UI: https://github.com/zwave-js/zwave-js-ui/blob/master/docker/docker-compose.yml. Note: zwave-js-ui used to be called jwavejsmqtt; some instructions still use the old name...)

With zwave-js-ui now running on port 8091, I followed instructions:

  • in Settings / Home Assistant, enabled "WS Server"
  • kept MQTT discovery disabled
  • disabled MQTT gateway
  • used circular arrows icons to generate random keys (S2_Unauthenticated etc.)

It looks like I do not need to do anything about Home Assistant Z-Wave add-on; on the Home Assistant side, I added Z-Wave integration with the default web-socket settings - and that's it!

Appealing to the control freaks who love doing everything themselves, this approach quickly becomes inconvenient - one needs to hand-craft or find a working docker-compose.yaml file for each add-on, and then manually update them all. For those who value convenience, better approach is to let Home Assistant itself take care of the add-on management and updates: it does use Docker internally, and provides UI for managing the add-ons and updating everything. This means - install Home Assistant OS.

So, I want to run Home Assistant OS on a dedicated machine without dedicating my home server to it and without any additional hardware. This means - virtual machines!

Virtual Machine - the one

Manual

One approach is to create Home Assistant virtual machine using virt-manager.

For it to be accessible from other machines on my network (including my phone), I need a special network setup; see "Network" in [[Virtual Machines]]. In the following, network interface set up for this purpose is named "mac0".

Official instructions for installing Home Assistant in a virtual machine:

  • wget the KVM (.qcow2) image from the list to /home/homeassistant;
  • uncompress resulting file with: unxz haos_ova-13.1.qcow2.xz;
  • In virt-manager: create a new virtual machine;
  • "Import existing disk image": browse to the downloaded and uncompressed image;
  • "Generic or unknown OS. Usage is not recommended.";
  • RAM: 8192 megabytes, 4 CPUs;
  • "Customize configuration before install.";
  • "Network selection: Macvtap device.": mac0
  • Overview / Firmware / UEFI x86_64: /usr/share/edk2/ovmf/OVMF_CODE.fd
  • Add Hardware / Channel: device type "unix"; org.qemu.guest_agent.0
  • "Begin Installation"

For the various USB dongles (Z-Wave, Zigbee, RTL) to be visible to the Home Assistant inside the virtual machine, they need to be added in "Add Hardware" of the virt-manager.

(Bluetooth controller did not work for me though, which is fine really; see https://www.reddit.com/r/VFIO/comments/wbsqy1/how_to_fix_onboard_intel_bluetooth_error_code_10/)

ProxMox

Just as running Home Assistant in a virtual machine is more convenient than managing its components manually, it is more convenient to run virtual machines using [[ProxMox]] than setting them up manually:

  • ProxMox takes care of the network setup that exposes the virtual machines to the local network using a bridge
  • there are community scripts that automate setting up virtual machines, including one for the Home Assistant.
  • ProxMox exposes a web-based management UI, so there is no need to run virt-manager UI over SSH

Add-Ons and Integrations

With Home Assistant installed in a virtual machine, adding add-ons is trivial. I use:

I also added HACS - Home Assistant Community Store.

Integrations I use:

  • ESPHome
  • MQTT
  • Viessmann ViCare
  • Z-wave
  • Zigbee Home Automation

Home Assistant Cloud and Backups

Just as it is more convenient to let Home Assistant OS manage itself than configure and update each add-on manually, it is more convenient to pay a little bit to Nabu Casa than setting up remote access manually.

Home Assistant Cloud can be configured to use a custom domain too!

Home Assistant Cloud supports storage of one backup; instead, I went with the Google Drive Backup Add-On.

Viessmann Boiler

To bring my new a Viessmann's Vitodens 100-W boiler under the control of Home Assistant, I:

  • installed Viessmann's ViCare application on my phone;
  • used it to connect the boiler to Viessmann's cloud over WiFi;
  • followed instructions on the ViCare integration, and it just worked!

A few month later I noticed that there are things that I can do using the ViCare application that I can't do in Home Assistant. I filed a bug - and it got fixed (thank you, CFenner!). Now I can switch from ViCare to Home Assistant completely :)

On July 10, 2025 I got a message from Viessmann about a Domain Change for the Viessmann API https://​api.​viessmann.​com to https://​api.​viessmann-climatesolutions.​com; not clear at this point what, if anything, I need to do about this...

Garage Door Opener

When I replaced my garage door openers in 2015, I wanted to be able to open the doors with my phone - just for fun! But it turned out that I needed some WiFi accessory that wasn't compatible with my model of the opener or some such...

Over the years, I though about building some Raspberry Pi-based thingy to control the garage door opener, but since I do not really need it, and interfacing with the opener properly did not seem trivial, I did nothing ;)

Recently, I saw a post I added a ratgdo to my garage door, and I don’t know why I waited so long. Turns out, one guy completely solved the garage door opener integration, and how! The product is compatible with any garage door opener and any home automation approach! And it's completely local: my data doesn't get shipped to the Garage Door Opener Manufacturer's cloud! So, I:

  • ordered a ratgdo v2.53i kit for $45 and ratgdo v2.53i holster for $9;
  • got them in a couple of days;
  • flashed the ESPHome firmware recommended for use with Home Assistant;
  • the tool itself added my board to my Home Assistant;
  • in Home Assistant's settings, set "Allow the device to perform Home Assistant actions";
  • powered down my garage door opener;
  • moved wires for the door button and obstruction sensors from the opener to the ratgo;
  • connected ratgo to the opener using supplied three-wire harness;
  • powered ratgo up with the supplied USB brick and cable;
  • powered the opener back up - and it just worked!

I am not sure how the sales of this little device can possibly fund continuous improvements to both hardware and firmware and research involved, especially since one needs to be a little bit of a geek to buy it...

I am in awe: one person developed and continues to improve a solution that completely covers this application area ;)

Professionally done labor of love - way to go!!

Firmware is ESPHome 2024.8.3 (re-OTAd 2026-08-19 only to move Wi‑Fi to podval-2g; still .240). Do not update to current esphome-ratgdo unless something is actually broken. Latest builds need ESPHome 2026.4+ and an API encryption key this board does not have — HA would drop until the key is added. ESP8266 OTA is tight; some 2026.1/2026.2 updates broke the handshake. If we ever flash again: pin a release, compile with a noise key, OTA from http://192.168.1.240, have a USB cable ready.

Z-Wave

From the list of Z-Wave controllers Home Assistant supports](https://www.home-assistant.io/docs/z-wave/controllers/), I picked "Zooz 800 Series Z-Wave Long Range S2 USB Stick ZST39 LR" ($37 on Amazon).

In the zwave-js-ui, my Z-Wave USB stick reports firmware version v1.40 and SDK version v7.22.0, which seem fine. ZOOZ firmware page has the latest firmware; ZOOZ firmware update instructions caution against updating the firmware using Home Assistant itself.

By now, I switched to Home Assistant Connect ZWA-2.

Thermostat

I have a Honeywell T6 Pro model TH6210U2001 thermostat; it does not have remote capabilities, so I can not integrate it with Home Assistant, but it turns out that other models in the Honeywell T6 Pro lineup do work with Home Assistant, and I do not need to re-wire anything, since all T6 models have the same mounting plate!

Bitten by the "local control, no cloud accounts" bug, I rejected WiFi models TH6220WF2006/U and TH6320WF2003/U, which require a Honeywell Cloud account, and settled on Z-Wave model TH6320ZW2003-U ($128 on Amazon).

Thermostat replacement went without a hitch, and I was able to add it to Z-Wave controller even though the my Z-Wave stick is plugged into a server in the attic,two floors above the thermostat with a few walls in-between - beautiful!

Zigbee

I bought Sonoff Zigbee 3.0 USB Dongle Plus-E Gateway ($33 on Amazon). Integrating it into Home Assistant turned out to be much simpler than the official instructions for ZHA (Zigbee Home Automation) make it sound: I plugged the dongle into the machine where Home Assistant is running and restarted the Home Assistant; it discovered the dongle, and when I agreed to integrate it, everything got configured automatically!

I also bought a Sonoff Zigbee Indoor Temperature and Humidity Sensor, SNZB-02D LCD ($20 on Amazon). Told ZHA to add a new device, pressed the pairing button on the device for 5 seconds - and that was it!

RTL 433

I have a little LCD device with three additional sensors that send data to the screen. Turns out, there is a library that handles the protocols such devices use: rtl_433! Of course, to decode the messages the sensors transmit, we first need to receive them using an RTL-SDR USB dongle.

Receiver/decoder can be run stand-alone, but does not have to when used in Home Assistant:

  • add the RTL-SDR USB dongle to the virtual machine running Home Assistant
  • add Mosquitto Broker add-on (HA creates a broker user for add-ons; do not add a Person named mqtt)
  • start the add-on
  • add MQTT integration with the Mosquitto broker
  • add rtl_433_next add-on

/config/rtl_433/next.conf.template (broker user/pass come from the add-on's MQTT service, not this file):

output      mqtt://${host}:${port},user=${username},pass=${password},retain=${retain}
protocol    20
convert     si
verbose 4

Only protocol 20 (Ambient Weather F007TH). Auto Discovery is stopped so neighbor sensors are not re-created; start it only if a real sensor gets a new ID after a battery change.

  • start the add-on (it picks up the template and the Supervisor MQTT service)
  • add rtl_433 MQTT Auto Discovery (next) add-on
  • configure it: host homeassistant, user mqtt, password mqtt - ?
  • start the add-on when adding a new 433 MHz sensor
  • add MQTT Explorer add-on
  • configure the connection to homeassistant:1883,user=mqtt,pass=mqtt
  • start the add-on when debugging topics

Garden

Added a SONOFF Sprinkler Timer Zigbee 3.0; since it is far from my server in the attic, placed a Zigbee plug on the inside of the wall where the garden faucet is :)

Security

I want to replace my door bell with a video one and install some cameras; I am thinking Reolink, which integrates with Home Assistant - although it seems that some additional trickery is needed for audio... Also, the head-to-toe version (white, not black) does not seem to be available...

Bought and installed in June 2026.

https://github.com/NS086/HomeAssistantBlueprints

https://community.home-assistant.io/t/reolink-how-do-i-create-a-home-assistant-notification-with-a-link-that-opens-the-reolink-camera-app/517971

Grok

I added my SSH public key to Home Assistant's Terminal/SSH add-on ("app"). Grok can use it once I SSH there first ;)

Current setup (2026-08)

Core 2026.8.2 on qemux86-64 (HAOS 18.2, [[ProxMox]] VM 100). Hostnames: homeassistant.local, homeassistant.lan.podval.org (192.168.1.209). Not 192.168.1.101 (that's the UniFi switch). Core HTTP is :8123 with ssl: false. Doorbell talk/mic needs a secure context; today that means Nabu Casa. /config is a symlink to /homeassistant.

configuration.yaml is stock: default_config plus includes for automations/scripts/scenes, plus a YAML notify action group notify.phones (Pixel 10 / Pixel 8 / Pixel 8 Remote). No packages/, no /config/esphome/. Scripts file is empty. Logic is YAML automations. Node-RED is installed but stopped (boot: manual, empty flow) — check it is still empty before adding YAML that might duplicate a future flow.

Add-ons started: Z-Wave JS, Terminal & SSH 10.4.0, Mosquitto, Google Drive Backup, rtl_433 (next). Boot manual: Node-RED and rtl_433 MQTT Auto Discovery are stopped; File editor and MQTT Explorer are in error. Custom: HACS + Frigate integration 5.15.4. Advanced Camera Card is unpacked under /config/www/advanced-camera-card/ v7.27.4 (not HACS); lovelace_resources is what actually loads it.

Keepers for the F007TH sensors: boiler 2-234, garage 1-55, deck 3-219.

Automations (do not clobber)

YAML is a list of maps (id, alias, modern triggers: / actions: keys, mode:). Timers that should reset when the device is turned on again use mode: restart — that is per-automation, not per entity, so do not combine the bathroom fans into one automation.

  • Shabbos/Yom Tov — tag tag.shabbos_yom_tov (3ef26f62-ef32-4d27-b819-1abf66dfa0ee) and automation shabbos_yom_tov_scene_before_sunset (sensor.jewish_calendar_sunset_shkia − 40 min, only if upcoming_candle_lighting is still ahead and within 2½ h) both scene.turn_on scene.shabbos_scene, then explicit switch.turn_on on switch.refrigerator_sabbath_mode. That scene: master bedroom Shabbos lights + fridge Sabbath on. No fridge tag (tag.refrigerator_shabbos_mode was removed). Do not use scene.master_bedroom_shabbos_scene.
  • Fridge Sabbath modeswitch.refrigerator_sabbath_mode (Samsung / SmartThings). Explicit switch.turn_on / switch.turn_off does reach the appliance (door light off/on). Do not rely on scenes alone: scene.turn_on skips an entity HA already thinks matches. Motzaei 2026-08-22 applied scene.night (which lists the switch off) while HA still showed off, so the fridge command never went out. Automation refrigerator_sabbath_follows_shabbos (automation.refrigerator_sabbath_mode_follows_shabbos_yom_tov) sends the switch command when Shabbos/Night/Day is actually activated (15 s recency, ignore unavailable) and when binary_sensor.jewish_calendar_issur_melacha_in_effect turns on/off. Motzaei motzei_shabbos_yom_tov_night_scene also switch.turn_off after Night.
  • Scenes YAML also has scene.night and scene.day (Day currently matches Night; both list fridge Sabbath off). Living Room is light.s2_dimmer (not light.light_2). Master bedroom on/off light is light.master_bedroom_light (not hidden switch.background_light).
  • Doorbell Notification → Reolink binary_sensor.front_door_visitor (button) or Frigate binary_sensor.stoop_person_occupancy (person whose feet are in the stoop zone) → notify.phones. binary_sensor.doorbell_person_occupancy is still anyone in frame — do not use it for notify. On button, frigate.create_event (visitor, 30s). Talk /lovelace-doorbell/talk. Keep Reolink for the chime. See [[Frigate]].
  • Bathroom fan auto-off (one automation per fan, mode: restart, 15 min):
    • fan.master_bathroom_fan
    • fan.bathroom_fan (UI name Bathroom Fan; helper over switch.1st_floor_bathroom_fan)
    • fan.guest_bathroom_fan
    • fan.attic_bathroom_fan (helper over switch.attic_bathroom_fan_2)
    • Not light.attic_bathroom_fan_light / switch.attic_bathroom_fan (that's the attic fan light)

Those fan devices also have disabled Z-Wave number.*_auto_turn_off_timer config params. Prefer the YAML automations unless I want the on-device timer.

Prefer the entity the UI/voice uses. Example: fan.master_bathroom_fan is switch_as_x over switch.master_bathroom_fan — automate the fan.

Stable entities (re-check the registry)

  • Garage: cover.ratgdov25i_0bd4e4_door (ratgdo v2.5i, .240 on podval-2g)
  • Garden: valve.back_garden_water, switch.sonoff_swv
  • Climate: climate.t6_pro_z_wave_programmable_thermostat
  • Boiler: sensor.e3_vitodens_100_na_0521_*
  • Doorbell button/chime (Reolink): binary_sensor.front_door_visitor, number.reolink_chime_*. Video/person ([[Frigate]]): camera.doorbell, binary_sensor.doorbell_person_occupancy. Disable camera.front_door_fluent.
  • Phones: device_tracker.pixel_10, notify.phones (group). Singles: notify.mobile_app_pixel_10 / notify.pixel_10 (and Pixel 8 / Pixel 8 Remote).
  • Speakers / Cast: Entryway speaker media_player.entryway_speaker (Nest Mini, Google Home name Entryway speaker, .117 on podval-u, area Entranceway). Google Cast hub is already configured (zeroconf + known host .117). Also on Cast: Family Room TV (media_player.family_room_tv_3; androidtv_remote is media_player.family_room_tv). Master Bedroom Nest Audio media_player.bedroom_speaker is currently unavailable. The Mini is a Google Assistant device — Cast gives HA a media_player (TTS / play media), not a Home Assistant voice satellite.

~700 enabled entities, ~2600 registered. Many lights still have generic ids (light.dimmer, light.light). Use the registry original_name / name to disambiguate.

person.mqtt is leftover from Mosquitto onboarding — delete in Settings → People. After that, the HA login user mqtt can go too; rtl_433 no longer uses it.

TODO

Move refrigerator to podval-2g, then make podval-u 5 GHz only. See [[UniFi]] § Later. ratgdo .240 is already on podval-2g.

Smoke / CO + garden leak notify. Sensors exist, nothing notifies. Attic Zooz ZEN55: binary_sensor.attic_fire_sensor_smoke_detected, binary_sensor.attic_fire_sensor_carbon_monoxide_detected. Garden SONOFF valve: binary_sensor.sonoff_swv_water_leak. Send notify.phones (Pixel 10 + both Pixel 8s), high priority. Do not trigger on the fire sensor idle binary sensor.

Advanced Camera Card via HACS (today it is just files in /config/www/advanced-camera-card/). Then drop the leftover frontend.extra_module_url in configuration.yaml; lovelace_resources is what actually loads the card.

Official Z-Wave JS → Z-Wave JS UI for network graph / heal / per-node debug. Do not run both add-ons. Switch doc.

https://www.home-assistant.io/integrations/zwave_js/#how-do-i-switch-between-the-official-z-wave-js-add-on-and-the-z-wave-js-ui-add-on

Watchman + battery status. Watchman for a weekly unavailable-entity report. Separate low-battery notify to notify.phones for real cells: eight SNZB-02D sensor.sonoff_snzb_02d_battery*, garden sensor.sonoff_swv_battery, T6 sensor.t6_pro_z_wave_programmable_thermostat_battery_level / binary_sensor.t6_pro_z_wave_programmable_thermostat_low_battery_level, F007TH keepers only (sensor.ambientweather_234_battery, sensor.ambientweather_f007th_1_55_battery, sensor.ambientweather_f007th_3_219_battery). Skip phone battery entities.

Floor plan dashboard. Draw in Sweet Home 3D / RoomSketcher / FreeCAD; see Floor Plans above.

Local HTTPS so doorbell Talk works on the LAN without Nabu Casa.

use simplified automation UI released in June 2026

https://www.home-assistant.io/dashboards/sections/#creating-a-sections-view

Can I replace my Honeywell HumidiPRO H6062 with something compatible with Home Assistant?

https://samakroyd.com/2024/09/25/home-assistant-weve-done-smart-home-what-about-smart-garden/

https://itead.cc/product/sonoff-zigbee-human-presence-sensor/

https://1projectaweek.com/blog/2023/8/7/rtl433-home-assistant-and-cheap-flood-sensors-oh-my

Maintenance dashboard!